package io;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;

/**
 * @Author wangzhipeng
 * @Date 2020-08-18 3:11 下午
 * @Description 演示File类 是对于电脑上文件和文件夹的抽象
 */
public class FileDemo {
    /**
     * 演示分割符
     * 分割符：上一层与下层分割所使用的符号
     */
    @Test
    public void demo(){
        String separator = File.separator;
        System.out.println(separator); // /

    }
    /**
     * 存在 创建 重命名 删除 查询
     */
    @Test
    public void demo2() throws IOException {
        //演示存在
        File file = new File("/Users/wangzhipeng/Desktop/蔬菜之乡.png");
        boolean exists = file.exists();// 判断是否存在
        System.out.println(exists);

        //演示创建
        File file2 = new File("/Users/wangzhipeng/Desktop/file.txt");
        if(!file2.exists()){
            file2.createNewFile();
        }
        //重命名（也可以当做移动使用）
        file2.renameTo(new File("/Users/wangzhipeng/Desktop/fileA.txt"));

    }

    /**
     * 删除文件
     * @throws IOException
     */
    @Test
    public void demo3() throws IOException {
        File file = new File("/Users/wangzhipeng/Desktop/demo3.txt");
        if (!file.exists()){
            file.createNewFile();
        }
        boolean delete = file.delete();
        if(delete){
            System.out.println("DELETE SUCCESSFULLY");
        }

    }

    /**
     * 创建目录与删除
     */
    @Test
    public void demo4(){
        File file = new File("/Users/wangzhipeng/Desktop/d/a");
        if (!file.exists()){
            file.mkdirs();
        }
        file.delete();//只能是空文件夹才能删除
    }

    /**
     * 文件的查询
     */
    @Test
    public void demo5() throws IOException {
        //文件
        File file = new File("/Users/wangzhipeng/Desktop/d/a.txt");
        if(!file.exists()){
            file.createNewFile();
        }
        System.out.println(file.getName());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getPath());
        System.out.println(file.getParent());
        System.out.println(file.length());  //文件内容的长度

        //文件夹
//        System.out.println(file.getName());
//        System.out.println(file.getAbsolutePath());
//        System.out.println(file.getPath());
//        System.out.println(file.getParent());

        //获取文件夹下面的所有的文件名
        File dirfile1 = new File("/Users/wangzhipeng/Desktop");
        String[] list = dirfile1.list();
        for(String item:list){
            System.out.println(item);
        }
        System.out.println("-------------------");
        //获取文件夹下面的所有的文件名（带有过滤）
        String[] list2 = dirfile1.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) { //name 是文件夹中每一项的名字
                if(name.endsWith("pptx")){
                    return true;
                }
                return false;
            }
        });

        for(String item:list2){
            System.out.println(item);
        }

    }

    @Test
    public void demo7(){
        File file = new File("/Users/wangzhipeng/Desktop");
        File[] files = file.listFiles();
        System.out.println(files.length);
        for(File item:files){
            System.out.println(item.getAbsolutePath());
        }
    }

    @Test
    public void demo8(){
        File file = new File("/Users/wangzhipeng/Desktop/fileA.txt");
        System.out.println(file.lastModified());//文件最后修改时间
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(simpleDateFormat.format(file.lastModified()));
    }



    /**
     * 	文件的查询
     */
    @Test
    public void demo9() {
        // 文件
//		File file = new File("F:\\b.txt");
//		File file2 = new File(parent, child);

//		System.out.println(file.getName()); // 查看名字
//		System.out.println(file.getPath()); // 查看路径
//		System.out.println(file.getParent()); // 获取父路径
//		System.out.println(file.getAbsolutePath()); // 获取绝对路径
//		System.out.println(file.length()); // 文件内容的长度

        // 文件夹
//		File dirFile = new File("F:\\a\\b\\c\\d");
//		System.out.println(dirFile.getName()); // 查看名字
//		System.out.println(dirFile.getPath()); // 查看路径
//		System.out.println(dirFile.getParent()); // 获取父路径
//		System.out.println(dirFile.getAbsolutePath()); // 获取绝对路径

        // 获取文件夹下面的所有的文件名
        File dirFile = new File("C:\\Windows");
//		String[] list = dirFile.list();

        // 获取文件夹下面的所有的文件名（带有过滤）
        String[] list = dirFile.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                /*
                 * 	dir:代指要查询的文件
                 * 	name:文件夹下面的文件的名字
                 * 	查询以.exe结尾的文件
                 * */
                return name.endsWith(".exe");
            }
        });

        for(String fileName : list) {
            System.out.println(fileName);
        }
    }


    /**
     * 	文件的列表
     */
    @Test
    public void demo10() {
        File dirFile = new File("C:\\Windows");
        // 返回文件的数组
//		File[] listFiles = dirFile.listFiles();

//		File[] listFiles = dirFile.listFiles(new FilenameFilter() {
//			@Override
//			public boolean accept(File dir, String name) {
//				System.out.println(dir.getAbsolutePath());
//				System.out.println(name);
//				return name.endsWith(".exe");
//			}
//		});

        File[] listFiles = dirFile.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".exe");
            }
        });

        for(File file : listFiles) {
            System.out.println(file.getAbsolutePath());
        }
    }


    /**
     * 	其他方法
     */
    @Test
    public void demo11() {

        File file = new File("F:\\b.txt");

        // 判断是否是文件和文件夹
        System.out.println("file是否是文件夹：" + file.isDirectory());
        System.out.println("file是否是文件：" + file.isFile());

        //
        System.out.println("file是否是隐藏的：" + file.isHidden());
        file.canExecute(); // 能否被执行
        file.canRead(); // 能否被读取
        file.canWrite(); // 能否被写入
        file.lastModified(); // 上一次修改的时间
    }




}
